(for Internet Explorer)
Sub  Bench( SectionNum as integer )
セクション(全体の中の一部の区間)の処理時間の計測を開始します。
参考
【引数】
SectionNum
セクションの識別番号
計測するセクションの開始位置に、SectionNum に1以上の値を指定して、Bench を呼び出してください。
計測するセクションの終了位置に、SectionNum に0を指定して、Bench を呼び出してください。
計測するセクションの終了位置が、次のセクションの開始位置であるときは、SectionNum に0を指定
しなくても、次のセクションの識別番号を指定できます。
ファイル:
vbslib.vbs
(src)
参考
Sub  BenchEnd()
全体の処理時間の計測を終了し、計測結果を表示します。
ファイル:
vbslib.vbs
(src)
テスト
→ T_Date.vbs
→ vbslib.vbs
ソース
Dim  g_VBS_Lib.ProgressTimer  as g_VBS_Lib_ProgressTimerClass
進捗状況を表示するオブジェクト。
サンプル
Set pr_timer = g_VBS_Lib.ProgressTimer
pr_timer.Interval_msec = 100
Do
    If pr_timer.GetShouldShow() Then _
        echo_v  "7/20"
Loop
T_ProgressTimer
データ構造
表示の更新間隔(ミリ秒)。 小さすぎると遅くなります。
デフォルトは、1000 ミリ秒。
カウント値。 0以上 .MaxCount 以下。
カウント値の最大値。、
表示のフォーマット。 以下の変数を指定できます。
${Percent}
.Count × 100 ÷ .MaxCount
${Count}
${MaxCount}
${Text}
.Count の値
.MaxCount の値
Start、End_、Plus、Show メソッドの in_Text 引数
デフォルト: " ${Percent}% ${Count}/${MaxCount} ${Text}"
表示のタイミングだけ見る場合
    Set pr_timer = g_VBS_Lib.ProgressTimer
    pr_timer.Start  Empty, 12, 100, ""
    Do Until  pr_timer.Count >= pr_timer.MaxCount
        Sleep  50  '// Do Anything

        pr_timer.Plus  +1, Empty
    Loop
    pr_timer.End_  ""
12回のループの進捗を 100ミリ秒ごとに表示する場合
サンプル
グローバルに1つだけ存在します。
Sub  g_VBS_Lib_ProgressTimerClass::Start( in_ShowFormat as string, _
    in_MaxCount as integer,  in_Interval_msec as integer,  in_Text as string )
進捗状況を表示を開始します。
【引数】
in_ShowFormat
in_MaxCount
に設定する値
に設定する値
in_Interval_msec
に設定する値
in_Text
の ${Text} から置き換える文字列
in_Text に Empty を指定したときは、開始したすぐには表示をしません。
Sub  g_VBS_Lib_ProgressTimerClass::End_( in_Text as string )
表示するタイミングではないときにカウント値が最大値になったときのために、表示します。
【引数】
in_Text
の ${Text} から置き換える文字列
〜 End_ は、ネストすることができます。
最も外側の
〜 End_ 以外は、何もしません。
in_Text に Empty を指定したときは、表示を更新しません。
Sub  g_VBS_Lib_ProgressTimerClass::Plus( in_PlusCount as integer,  in_Text as string )
進捗状況のカウント値をプラスして、表示するタイミングだったら、表示内容を変更します。
【引数】
in_PlusCount
in_Text
カウント値をプラスする値
の ${Text} から置き換える文字列
Function  g_VBS_Lib_ProgressTimerClass::GetShouldShow() as boolean
表示するタイミングかどうかを返します。
メモ
Reset メソッドは廃止。 ネストできないため。
Function  IsSame( Left, Right ) as boolean
= とほぼ同じですが、Empty, Null と "" を比較しても False を返します。
テスト
ソース
→ T_Arr.vbs
T_IsSame
→ vbslib.vbs
テスト
→ vbslib.vbs
ソース
→ T_Arr.vbs
T_AddArray
Function  Add( Operand1 as type1, Operand2 as type1 ) as type1
加算します。
type1 は、以下の型を指定できます。
・ + 演算子が使える型(数値型、文字列型)
・配列型
  Set  vars = CreateObject( "Scripting.Dictionary" )
  vars.Item( "a" ) = 2
  Assert  CalculateVariables( "a + 3", vars ) = 5
Function  CalculateVariables( Formula as string, Variables as dictionary ) as variant
文字列で表現された計算式を計算します。
【引数】
Formula
Variables
計算式。 VBScript の文法で表現したもの
計算式で使える変数の集合
返り値
計算結果
ファイル:
vbslib.vbs
関連
テスト
"a + 3"
サンプル
(src)
計算式に、Variables 引数に指定した変数を使うことができます。
変数の値は、数値だけでなく、文字列やオブジェクトも指定できます。
→ T_Calc.vbs # [T_Calc]
変数の値が文字列型であっても、数値として計算します。
変数の値が他の変数の参照にすることもできます。
  Set  vars = CreateObject( "Scripting.Dictionary" )
  vars.Item( "a" ) = 2
  vars.Item( "b" ) = "3"
  vars.Item( "c" ) = "b"
  Assert  CalculateVariables( "a + b + c", vars ) = 8
  Set pos = new NestPos

  '// pos.PosArr = Array( 0 )

  pos.Start  '// pos.PosArr = Array( 1, 0 )
  pos.End_   '// pos.PosArr = Array( 1 )

  pos.Start    '// pos.PosArr = Array( 2, 0 )
    pos.Start  '// pos.PosArr = Array( 2, 1, 0 )
    pos.End_   '// pos.PosArr = Array( 2, 1 )
  pos.End_     '// pos.PosArr = Array( 2 )
処理順序におけるネスト(入れ子)の位置をカウント・アップします。
Dim  NestPos::PosArr  as Array of integer
.PosArr
.Start
Sub  NestPos::Start()
.End_
Sub  NestPos::End_()
現在のネストの位置。
配列番号は、ネストの深さに対応します。
ブロックの開始。
カウント・アップして、配列の要素を1つ増やします。
ブロックの終了。
配列の要素を1つ減らします。
(src)
オブジェクトかどうかによって、Out = In_ または Set Out = In_ をします。
静的オブジェクト (または演算器的なオブジェクト) を取得します。
スクリプトファイルをインクルードして、静的オブジェクトを取得します。
静的オブジェクト・スクリプトファイルをすべて取得して一覧できるようにします。
静的オブジェクト・スクリプトファイルをインクルードします。
単純な DefineInfo オブジェクトを生成します。
指定のインターフェースを持った、静的な一般名オブジェクトを取得します。
ストリームから、オブジェクトを1つ生成します。
ストリームから、オブジェクトをいくつか生成して、配列に格納します。
文字列で指定した名前のクラスのオブジェクトを生成します。
Name 変数と、Delegate 変数の対応関係を表すクラスです。
何もしないコールバック関数の本体。
相互参照しているオブジェクトのライフサイクルを管理します。
イベントが発生したらコールバックされる関数の集合。
Sub  LetSet( Out as variant, In_ as variant )
In_ がオブジェクトかどうかによって、Out = In_ または Set Out = In_ をします。
  If IsObject( In_ ) Then  Set Out = In_ Else Out = In_
一般に、LetSet を呼び出すより、IsObject で判定(上記のコード)を記述した方が高速ですが、
In_ に関数や Dictionary::Item などの重い処理を記述するときは、その重い処理を
2度実行させないLetSet の方が高速です。
実装:
サンプル:
  LetSet  v, dic("name")  '// Set "v"
→ T_Var.vbs
テスト
T_LetSet
ソース
→ vbs_inc_sub.vbs
関連
代入先が配列、または、辞書のとき
代入元が辞書のとき
Out 引数にオブジェクトのプロパティを指定しないでください。 設定されません。
なぜなら、プロパティを引数に指定すると、値渡しになるからです。
Sub  LetSetWithBracket( out_Collection as variant, in_Index as variant, in_Item as variant )
配列、または、辞書の要素に登録します。
  LetSetWithBracket  dic, "key", 1
→ T_Var.vbs
テスト
T_LetSet
ソース
→ vbs_inc_sub.vbs
配列、または、辞書に代入するときの
です。
関連
下記のどちらかのコードに相当します。
out_Collection( in_Index ) = in_Item
Set out_Collection( in_Index ) = in_Item
サンプル
【引数】
out_Collection
in_Index
(入出力)  配列 または 辞書、( ) で要素にアクセスできるコレクション
配列番号 または 辞書のキー
in_Item
配列 または 辞書に追加する値 (オブジェクト または 非オブジェクト)
Function  get_Object( Name as string ) as Object
静的オブジェクト (または演算器的なオブジェクト) を取得します。
【引数】
Name
取得するオブジェクトのクラス名
返り値
オブジェクト
サンプル:
関連
  Dim  name : name = "ClassA"
  Dim  obj : Set obj = get_Object( name )
Dim  g_ClassA

Function    get_ClassA()  '// has_interface_of ClassI
  If IsEmpty( g_ClassA ) Then _
    Set g_ClassA = new ClassA : ErrCheck
  Set get_ClassA =   g_ClassA
End Function
get_Object は、機能的には、"get_" + Name の関数を呼び出すだけなので、
別途関数を用意する必要があります。
たとえば、Name = "ClassA" なら、get_ClassA の関数が呼ばれます。
ClassI
ClassA
ClassA
ClassA
ClassA
ClassA
ClassA
ClassA
(src)
Name が変数ではないときは、直接 get_ClassA を呼び出すことができます。
  Dim  obj : Set obj = get_ClassA()
new でオブジェクトを生成すると、get_ClassA で取得できるオブジェクトと別の
インスタンスになります。
Name が動的に変わることがないときは、get_ClassA 関数を直接呼び出して
ください。
→ T_GetObject.vbs [T_IncludeObjs1]
テスト
静的オブジェクトが無ければ、エラーになります。
Function  get_ObjectFromFile( ModulePath as string, Name as string ) as Object
スクリプトファイルをインクルードして、静的オブジェクトを取得します。
【引数】
ModulePath
Name
スクリプトファイルのパス
取得するオブジェクトのクラス名
返り値
取得したオブジェクト
  Dim  m : Set m = get_ObjectFromFile( "Lib\SampleLib.vbs", "Sample" )
サンプル: SampleLib.vbs ファイルで定義されている Sample オブジェクトを取得する。
上記サンプルは、下記と同じです。
  include  "Lib\SampleLib.vbs"
  Dim m : Set m = get_Sample()
オブジェクトを取得する部分は、機能的には、"get_" + Name の関数を呼び出すだけなので、
スクリプトファイルの中で、別途関数を定義する必要があります。 参考
(src)
→ T_GetObject.vbs get_ObjectFromFile [T_NewModule]
テスト
(src)
Sub  get_ObjectsFromFile( GetFuncs as string or Array of Function,
                          InterfaceName as string, out_Objs as Array of Object )
静的オブジェクト・スクリプトファイルをすべて取得して一覧できるようにします。
【引数】
GetFuncs
InterfaceName
スクリプトのパス、または include_objs の out_GetFuncs
Empty または、取得するオブジェクトが持つインターフェース
out_Objs
取得したオブジェクトの配列
  get_ObjectsFromFile  "Lib\*_obj.vbs", "ClassI", m_Objs '// [out] m_Objs
サンプル: インクルードと同時に、静的オブジェクトを取得する
  include_objs  "Lib\*_obj.vbs", Empty, m_CreateFuncs '// [out] m_CreateFuncs
  get_ObjectsFromFile  m_CreateFuncs, "ClassI", m_Objs '// [out] m_Objs
サンプル: インクルードした後で、静的オブジェクトを取得する(ファイルを走査しない)
Sub  get_StaticObjects( InterfaceName, out_Obj )
  If IsEmpty( InterfaceName ) or  InterfaceName = "ClassI" Then
    Set  out_Obj = get_ClassA()
  ElseIf InterfaceName = "ClassI2" Then
    out_Obj = Array( get_ClassA(),  get_ClassB() )
  End If
End Sub
静的オブジェクトを一覧できるようにするには、それぞれのスクリプトで、get_StaticObjects
関数を定義する必要があります。 get_ObjectsFromFile や include_objs は、別のスクリプト
ファイルであれば、同じ関数名でも異なる関数インスタンスになります。
参考
→ T_GetObject.vbs [T_IncludeObjs2] [T_IncludeObjs3]
テスト
参考
Function  new_X( Name as string ) as object
文字列で指定した名前のクラスのオブジェクトを生成します。
Function  new_ClassA()
    Set new_ClassA = new ClassA
End Function
機能的には、"new_" + Name の関数を呼び出すだけなので、別途関数を用意する必要があります。
たとえば、Name = "ClassA" なら、new_ClassA の関数が呼ばれます。
(src)
ただし、多くの場合、get_Object の方が適していることが多いので、get_Object を使うことを検討
してください。
サンプル:
Dim  obj : Set obj = new_X( "ClassA" )
引数は、なしにしてください。
Sub  include_objs( Wildcard as string, Flags as Empty, out_GetFuncs as Array of Funcion )
静的オブジェクト・スクリプトファイルをインクルードします。
【引数】
Wildcard
Flags
スクリプトファイルのパス、またはフォルダパス
Empty を指定してください
out_GetFuncs
Empty、または、静的オブジェクトを取得する関数の集合
out_CreateFuncs が Empty ではないときのサンプル
include_objs は、インクルードのみ行います。 オブジェクトの生成は、new で生成するか、
get_ObjectsFromFile で行います。
(src)
サンプル: Lib フォルダをインクルードして、その中で定義された ClassA オブジェクトを生成する。
  include_objs  "Lib\*_obj.vbs", Empty, Empty
  Set obj : Set obj = new ClassA : ErrCheck
→ new_X_array
Flags = Empty かつ out_GetFuncs = Empty なら、include で代用できます。
関連
out_GetFuncs は、静的オブジェクトを取得する関数の集合です。 get_ObjectsFromFile の第1引数
に渡すと、文字列を渡したときより高速に処理します。
→ T_GetObject.vbs [T_IncludeObjs1c]
テスト
→ T_GetObject.vbs [T_IncludeObjs3]
→ T_GetObject.vbs [T_IncludeObjsMulti]
→ T_GetObject.vbs [T_IncludeObjsMulti_NoWild]
→ T_GetObject.vbs [T_IncludeObjsEmptyArray]
Sub  get_DefineInfoObject( in_out_Object as DefineInfoClass, FullPath as string )
単純な DefineInfo オブジェクトを生成します。
参考
DefineInfo オブジェクトに FullPath プロパティしか必要ないときのみ使えます。
他のプロパティがあるときは、
(src)
Dim  g_SrcPath
If IsEmpty( g_SrcPath ) Then  MsgBox "This is vbslib object file." : WScript.Quit
Dim  g_Sample_vbs : get_DefineInfoObject  g_Sample_vbs, g_SrcPath
'// g_Sample_vbs.FullPath
サンプル:
Function  get_NameDelegator( Name as string, TrueName as string,
                             InterfaceName as string ) as InterfaceName_Delegator
指定のインターフェースを持った、正式名オブジェクトに委譲する、静的な一般名オブジェクトを取得します。
【引数】
Name
TrueName
一般名。 取得するオブジェクトの Name プロパティ
正式名。 取得するオブジェクトの委譲先 (*1)
InterfaceName
一般名オブジェクトと正式名〜が共通に持つ、インターフェースの名前 (*2)
(src)
一般名オブジェクト (*3)
返り値
(*2)
(*3)
Name と TrueName の組み合わせが初めてのときは、get_NameDelegator の内部で、
new_(InterfaceName)_Delegator 関数を呼び出して、オブジェクトを生成します。
返り値となるオブジェクトにアクセスすると、Name プロパティとオブジェクトの実体の違いを除けば、
正式名オブジェクトにアクセスします。
(ここでは一般名オブジェクト)を生成することができる、new_(InterfaceName)_Delegator
関数が定義されていること。 参考:new_X
と、(InterfaceName) インターフェースを持ったインスタンス
Class NameDelegator  '// defined_as_interface
  Public  Name
  Public Property Get  TrueName() : TrueName = NameDelegator_getTrueName( Me ) : End Property
  Public  m_Delegate ' as ClassA or ClassB or string(before validated)
  Public Property Get  DefineInfo() : Set DefineInfo = m_Delegate.DefineInfo : End Property
End Class

Const  F_ValidateOnlyDelegate = &h40000000
Dim    g_bNeedValidateDelegate
Function  NameDelegator_getTrueName( m )
Sub       NameDelegator_validate( m, Flags )
Function  NameDelegator_getXML( m )
DefineInfo プロパティは、オプションです。
  Public Property Get  DefineInfo() : Set DefineInfo = m_Delegate.DefineInfo : End Property
テスト
→ T_NameDelegator_vbslib フォルダ
参照
場面Aの関数
Name 以外は
参照
場面Aでの Name
場面Bでの Name
ある1つのインスタンス
TrueName
(正式名)
ClassI_Delegator クラス
(一般名)
場面Bの関数
ClassI
ClassI
ClassB
ClassI
ClassA
Name = "ClassN", TrueName = "ClassA"
Name = "ClassN", TrueName = "ClassB"
一般名で選択
参照
一般名と正式名の関係は、1対多、または、多対1があります。
(*1)
(InterfaceName) インターフェースを持った、静的な正式名オブジェクトを取得することができる
get_(TrueName) 関数が定義されていること。 参考:get_Object
get_NameDelegator 関数は、
ものです。 get_NameDelegator 関数は、get_(一般名) 関数の内部からのみ呼ばれるようにしてください。
の内部で呼ばれる get_(一般名) 関数の実装を支援する
サンプル:
Function  get_GeneralObject()
  Set  get_GeneralObject = get_NameDelegator( "GeneralObject", "TrueName", "InterfaceName" )
End Function

Function  get_TrueName() : ... : End Function
Function  new_InterfaceName_Delegator() : ... : End Function
返り値となる一般名オブジェクトは、Name プロパティと委譲元となるオブジェクトの実体の違いを除けば、
同じ1つの正式名オブジェクトとして扱うことができます。 参考: 下記の図の「ある1つのインスタンス」
(src)
Sub  new_ObjectFromStream( out_Obj as object, ClassName as string, Stream as variant )
ストリームから、オブジェクトを1つ生成します。
【引数】
out_Obj
ClassName
(出力) ストリームから生成した1つのオブジェクト、または Empty
生成するオブジェクトのクラス名 (下記)
Stream
XML ストリーム (下記)
ClassName 引数
XML のタグ名がクラス名に対応します。
XML のタグの中の属性まで一致するデータを元にオブジェクトを生成するときは、
XPath と同様に下記のようにします。
Set xml = LoadXML( "Sample.xml", Empty )
new_ObjectFromStream  obj, "ClassA[@attr='value']", xml
参考
→ XPath の [@name='value'] (属性の値)
<Root><ClassA attr="value" ... /></Root>
VBScript コード
XMLデータ
Stream 引数
の引数に指定できるものを指定できます。
new_X に対応した関数の準備
内部で、new_X を呼び出しています。 new_X を使うのに必要な関数を用意する必要が
あります。 たとえば、ABC クラスなら、new_ABC 関数が必要です。
参考
テスト
→ T_ObjectFromStream フォルダ